package com.lazycat.leetcode.editor.cn;
//2023-07-22 16:44:15
//设计一个算法，判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘，由字符" "，"X"和"O"组成，其中字符" "代表一个空位。 
//
// 以下是井字游戏的规则： 
//
// 
// 玩家轮流将字符放入空位（" "）中。 
// 第一个玩家总是放字符"O"，且第二个玩家总是放字符"X"。 
// "X"和"O"只允许放置在空位中，不允许对已放有字符的位置进行填充。 
// 当有N个相同（且非空）的字符填充任何行、列或对角线时，游戏结束，对应该字符的玩家获胜。 
// 当所有位置非空时，也算为游戏结束。 
// 如果游戏结束，玩家不允许再放置字符。 
// 
//
// 如果游戏存在获胜者，就返回该游戏的获胜者使用的字符（"X"或"O"）；如果游戏以平局结束，则返回 "Draw"；如果仍会有行动（游戏未结束），则返回 
//"Pending"。 
//
// 示例 1： 
//
// 输入： board = ["O X"," XO","X O"]
//输出： "X"
// 
//
// 示例 2： 
//
// 输入： board = ["OOX","XXO","OXO"]
//输出： "Draw"
//解释： 没有玩家获胜且不存在空位
// 
//
// 示例 3： 
//
// 输入： board = ["OOX","XXO","OX "]
//输出： "Pending"
//解释： 没有玩家获胜且仍存在空位
// 
//
// 提示： 
//
// 
// 1 <= board.length == board[i].length <= 100 
// 输入一定遵循井字棋规则 
// 
//
// Related Topics 数组 计数 矩阵 👍 42 👎 0

class TicTacToeLcci {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new TicTacToeLcci().new Solution();
        solution.tictactoe(new String[]{"O X"," XO","X O"});
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String tictactoe(String[] board) {
        int N = board.length;
        int[][] strs = new int[N][N];
        boolean flag = false;
        for(int i = 0;i<N;i++){
            for(int j = 0;j<N;j++){
                if(board[i].charAt(j) == 'X'){
                    strs[i][j] = 2;
                }else if(board[i].charAt(j) == 'O'){
                    strs[i][j] = 1;
                }else {
                    strs[i][j] = 0;
                    flag = true;
                }
            }
        }
        //横行遍历
        for(int i = 0;i<N;i++){
            int count = 0;
            int j = 0;
            for(;j<N;j++){
                if(strs[i][j] == 0){
                    break;
                }
                count += strs[i][j];
            }
            if(count == N && j == N){
                return "O";
            }else if(count == 2*N && j == N){
                return "X";
            }
        }
        //纵向遍历
        for(int i = 0;i<N;i++){
            int count = 0;
            int j = 0;
            for(;j<N;j++){
                if(strs[j][i] == 0){
                    break;
                }
                count += strs[j][i];
            }
            if(count == N && j == N){
                return "O";
            }else if(count == 2*N && j == N){
                return "X";
            }
        }
        int count = 0;
        //对角线遍历
        for(int i = 0;i<N;i++){
            if(strs[i][i] == 0){
                break;
            }else {
                count+= strs[i][i];
            }
            if(count == N && i == N-1){
                return "O";
            }else if(count == 2*N && i == N-1){
                return "X";
            }
        }
        count = 0;
        for(int i = 0,j = N-1;i<N;i++,j--){

            if(strs[i][j] == 0){
                break;
            }else {
                count += strs[i][j];
            }
            if(count == N && i == N-1){
                return "O";
            }else if(count == 2*N && i == N-1){
                return "X";
            }
        }

        return flag ? "Pending" : "Draw";
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}